home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / magrex / mag2.asm next >
Assembly Source File  |  1991-10-18  |  3KB  |  213 lines

  1. ;  mag2.asm 91.03.27
  2. ;  copyright(c)1991 K.Kurosaki 
  3.  
  4.                 .386p
  5.  
  6. code            segment    dword public ER use32 'CODE'
  7.                 assume     cs:CODE,ds:CODE
  8.  
  9. mag             proc    near
  10.  
  11.         mov    ebp,esp
  12.         mov    ebx,[ebp+4]    ; 第一パラメータ BASE ADDRESS
  13.  
  14.         mov    eax,[ebp+8]    ; 第二パラメータ
  15.         cmp    eax,200
  16. ;        ja    mag02        ; 200より大
  17.  
  18.         cmp    eax,0        ; =0
  19. ;        jne    mag04
  20. mag02:
  21.         mov    eax,1        ; 範囲外は1
  22. mag04:
  23.         mov    scr_line,eax    ; 1回分のスクロール
  24.     
  25.         mov    ax,[ebx+8]    ; x2
  26.         shr    ax,3
  27.         mov    dx,[ebx+4]    ; x1    
  28.         shr    dx,3
  29.         sub    ax,dx
  30.         inc    ax
  31.         mov    xloop,ax    ; X繰り返し
  32.  
  33.         mov    ax,[ebx+10]    ; y2
  34.         sub    ax,[ebx+6]    ; y1
  35.         inc    ax
  36.         mov    ycnt,ax        ; y繰り返し
  37.     
  38.         xor    eax,eax
  39.         xor    ecx,ecx
  40.         mov    cx,[ebx+4]    
  41.         and    cx,0fff8h
  42.         shr    cx,1        ; X1/2
  43.         mov    ax,[ebx+6]
  44.         shl    eax,9        ; Y1*512
  45.         add    eax,ecx
  46.         mov    edi,eax        ; VRAMスタートアドレス
  47.         push    edi
  48.  
  49.         mov    edx,[ebx+24]    ; ピクセルのオフセット
  50.         add    edx,ebx
  51.         mov    ecx,[ebx+28]    ; ピクセルのサイズ
  52. mag10:
  53.         mov    al,[edx]
  54.         mov    ah,al        ; 上位下位ニブルの交換
  55.         shl    al,4
  56.         shr    ah,4
  57.         or    al,ah
  58.         mov    [edx],al
  59.         inc    edx
  60.         loop    mag10
  61.  
  62.         mov    edi,offset f_start ; F()領域のクリア
  63.         mov    ecx,640/4
  64.         xor    eax,eax
  65.         cld
  66.     rep    stosd
  67.  
  68.         mov    ecx,[ebx+16]    ; フラグB
  69.         add    ecx,ebx
  70.  
  71.         mov    esi,[ebx+24]    ; ピクセル
  72.         add    esi,ebx
  73.  
  74.         mov    eax,[ebx+12]    ; フラグA
  75.         add    eax,ebx
  76.         mov    ebx,eax    
  77.  
  78.         mov    ax,104h
  79.         mov    es,ax        ; VRAMのセレクタ
  80.  
  81.         pop    edi
  82.  
  83.         xor    eax,eax        ; eaxの上位は0
  84.         mov    ah,[ebx]    ; フラグA    
  85.         inc    ebx
  86.         mov    bcnt,8
  87. mag20:
  88.         cmp    edi,400*512    ; 400ラインかいた?
  89.         jb    mag22        ; まだ
  90.  
  91. ;        call    vrammov
  92.  
  93.         push    ds
  94.         push    esi
  95.         push    ecx
  96.  
  97.         mov    cx,104h
  98.         mov    ds,cx
  99.  
  100.         if    0
  101.         mov    esi,scr_line
  102.         shl    esi,9
  103.         mov    edi,0
  104.         mov    ecx,400
  105.         sub    ecx,scr_line
  106.         shl    ecx,7
  107.         else
  108.         mov    esi,1 ; scr_line
  109.         shl    esi,9
  110.         mov    edi,0
  111.         mov    ecx,(400-1)*512/4
  112.         endif
  113.         cld
  114.     rep    movsd        
  115.  
  116.         pop    ecx
  117.         pop    esi
  118.         pop    ds
  119.  
  120.         mov    edi,400        ; 
  121.         sub    edi,scr_line
  122.         shl    edi,9
  123. mag22:
  124.         push    word ptr xloop
  125.         pop    word ptr xcnt    ; Xの繰り返し数
  126.  
  127.         mov    edx,offset f_start ; F()
  128.         push    edi
  129. mag30:
  130.         mov    al,[edx]    ; F()からもってきて
  131.         shl    ah,1        ; フラグAを1ビットみて
  132.         jnc    mag32        ; 0だった
  133.  
  134.         xor    al,[ecx]    ; フラグB    
  135.         mov    [edx],al
  136.         inc    ecx
  137. mag32:
  138.         inc    edx        ; F()
  139.         dec    word ptr bcnt        
  140.         jne    mag34
  141.  
  142.         mov    ah,[ebx]    ; フラグA    
  143.         inc    ebx
  144.         mov    bcnt,8
  145. mag34:
  146.         push    eax
  147.         shr    al,4        ; 上位ニブル
  148.         call    pix
  149.         pop    eax
  150.  
  151.         push    eax
  152.         call    pix        ; 下位ニブル
  153.         pop    eax
  154.  
  155.         dec    word ptr xcnt
  156.         jne    mag30
  157.  
  158.         pop    edi
  159.         add    edi,512
  160.  
  161.         dec    word ptr ycnt
  162.         jne    mag20
  163.  
  164.         ret
  165.  
  166. mag        endp
  167.  
  168. pix        proc    near
  169.     
  170.         and    al,0fh
  171.         je    pix10        ; フラグ=0
  172.         
  173.         xor    ah,ah
  174.         shl    ax,2        ; テーブル参照のため
  175.         mov    eax,vpos[eax]    ; VRAMの相対値
  176.         mov    ax,es:[edi][eax] ; VRAMの値
  177.         stosw            ; VRAMへ
  178.         ret
  179. pix10:
  180.         movsw            ; ピクセルからVRAMへ
  181.         ret
  182.  
  183. pix        endp
  184.  
  185. vpos        dd    0    ; 0
  186.         dd    -2    ; 1
  187.         dd    -4    ; 2
  188.         dd    -8    ; 3
  189.         dd    -512    ; 4
  190.         dd    -514    ; 5
  191.         dd    -1024    ; 6
  192.         dd    -1026    ; 7
  193.         dd    -1028    ; 8
  194.         dd    -2048    ; 9
  195.         dd    -2050    ; 10
  196.         dd    -2052    ; 11
  197.         dd    -4096    ; 12
  198.         dd    -4098    ; 13
  199.         dd    -4100    ; 14
  200.         dd    -8192    ; 15
  201.  
  202. xloop        dw    ?
  203. xcnt        dw    ?
  204. ycnt        dw    ?
  205. bcnt        dw    ?
  206.  
  207. scr_line    dd    ?
  208.  
  209. f_start        db    ?
  210.  
  211. CODE            ends
  212.                 end
  213.